#include <my_header.h>
// 传入共享的堆空间 主线程和子线程都可以对堆空间内的数据
// 进行修改 这时子线程的函数需要传参(堆空间) 
// 首先主线程往堆空间里面写数据 等待1s后子线程再次写数据
// 此时主线程的数据被子线程覆盖
/* Usage: ./5_shared_heap */
// 多线程共享堆空间
void *threadFunc(void *arg)
{
    // 传入的堆空间
    char *pHeap = (char *)arg;
    printf("I am child thread");

    strcpy(pHeap, "子线程");    // 复制字符串
    printf("child thread, %s\n", pHeap);
    
    // 这里不应该释放堆空间
    return NULL;
}
int main(void){                                  

    char *pHeap = (char *)malloc(20);   // 申请堆空间
    ERROR_CHECK(pHeap, NULL, "malloc");
    strcpy(pHeap, "主线程");

    pthread_t tid;  // 用于存储线程id
    // 这一次创建子线程 需要传子线程的参数
    int ret = pthread_create(&tid, NULL, threadFunc, (void *)pHeap);
    THREAD_ERROR_CHECK(ret, "pthread_create");

    printf("I am main thread\n");

    sleep(1);
    printf("parent thread, %s\n", pHeap);

    // 及时释放堆空间 以免内存泄露
    free(pHeap);

    return 0;
}


